#ifndef __FLASH_IF_H
#define __FLASH_IF_H

#include "stm32f4xx_hal.h"


/* 定义 Flash 扇区信息结构体 */
typedef struct {
    uint32_t Sector;       // 扇区编号，如 FLASH_SECTOR_6
    uint32_t StartAddress; // 该扇区的起始地址
} FlashSectorInfo;

typedef enum {
	FlashFunc_BOOT,
	FlashFunc_APP,
	FlashFunc_PARAM,
}FlashFunc;

typedef struct {
	FlashFunc Func;						// 区域类型：Boot、App、Param 等
	uint32_t 	SectorStartID;	// 升级区域起始扇区 ID，对应 f4xx_flash_tbl 数组中的扇区编号索引
	uint32_t 	SectorEndID;		// 升级区域结束扇区 ID，对应 f4xx_flash_tbl 数组中的扇区编号索引
} FlashUpdateInfo;


extern const FlashSectorInfo f4xx_flash_tbl[];
extern const FlashUpdateInfo flash_update_tbl[];
/**
  * @brief  擦除指定扇区。
  * @param  StartSector: 起始扇区编号（例如 FLASH_SECTOR_6）。
  * @param  NbSectors: 要擦除的扇区数目。
  * @retval HAL 状态，HAL_OK 表示成功。
  */
HAL_StatusTypeDef FLASH_EraseSectors(uint32_t StartSector, uint32_t NbSectors);

/**
  * @brief  写入一个 32 位数据（word）到指定地址。
  * @param  Address: 目标地址，必须是 4 字节对齐。
  * @param  Data: 要写入的 32 位数据。
  * @retval HAL 状态，HAL_OK 表示成功。
  */
HAL_StatusTypeDef FLASH_WriteWord(uint32_t Address, uint32_t Data);

/**
  * @brief  从指定地址读取一个 32 位数据。
  * @param  Address: 要读取的地址。
  * @retval 读取到的 32 位数据。
  */
uint32_t FLASH_ReadWord(uint32_t Address);


/**
  * @brief  写入一组 32 位数据到 Flash。
  * @param  Address: 起始写入地址，必须是 4 字节对齐。
  * @param  Data: 指向数据数组的指针，每个元素为 32 位。
  * @param  Length: 要写入的 32 位数据数量。
  * @retval HAL 状态，HAL_OK 表示成功；否则返回错误码。
  */
HAL_StatusTypeDef FLASH_WriteBuffer(uint32_t Address, uint32_t *Data, uint32_t Length);

#endif /* __FLASH_IF_H */
